package com.example.springbooteasycode.zjrc.knowledgeSharing;

/**
 * 十六进制字符串转Ascii码字符串、Ascii码字符串转十六进制字符串
 */
public class AsciiToHexUtils {
    public static void main(String[] args) {
        String asciiStr = "TSMP0001";
        // ASCII转十六进制
        String hexStr = asciiToHex(asciiStr);
        System.out.println("ASCII转十六进制结果: " + hexStr);

        // 十六进制转ASCII
        String hexStrConverter = "3130";
        String reversedAscii = hexToAscii(hexStrConverter);
        System.out.println("十六进制转回ASCII结果: " + reversedAscii);
    }

    /**
     * ASCII字符串转换为十六进制字符串
     *
     * @param asciiStr 输入ASCII字符串
     * @return 大写十六进制字符串（每个字符对应2位十六进制）
     */
    public static String asciiToHex(String asciiStr) {
        if (asciiStr == null || asciiStr.isEmpty()) {
            return "";
        }
        StringBuilder hexBuilder = new StringBuilder();
        for (char c : asciiStr.toCharArray()) {
            // 转换为十六进制，确保2位（不足补0）
            String hex = String.format("%02X", (int) c);
            hexBuilder.append(hex);
        }
        return hexBuilder.toString();
    }

    /**
     * 十六进制字符串转换为ASCII字符串
     *
     * @param hexStr 输入十六进制字符串（长度需为偶数，仅含0-9、A-F、a-f）
     * @return 转换后的ASCII字符串
     * @throws IllegalArgumentException 若输入不合法（长度奇数或含无效字符）
     */
    public static String hexToAscii(String hexStr) {
        if (hexStr == null || hexStr.isEmpty()) {
            return "";
        }
        // 校验十六进制字符串长度是否为偶数
        if (hexStr.length() % 2 != 0) {
            throw new IllegalArgumentException("十六进制字符串长度必须为偶数");
        }
        // 校验是否包含无效字符
        if (!hexStr.matches("[0-9A-Fa-f]+")) {
            throw new IllegalArgumentException("十六进制字符串包含无效字符");
        }

        StringBuilder asciiBuilder = new StringBuilder();
        // 每2位十六进制对应一个ASCII字符
        for (int i = 0; i < hexStr.length(); i += 2) {
            // 截取2位十六进制
            String hexChar = hexStr.substring(i, i + 2);
            // 转换为十进制数值（ASCII码）
            int asciiCode = Integer.parseInt(hexChar, 16);
            // 转换为字符（ASCII码范围0-127）
            asciiBuilder.append((char) asciiCode);
        }
        return asciiBuilder.toString();
    }
}

